window.relateChecks = function(jqnode){
    jqnode.find('.rc-selectall').change(function(){
        let val = $(this).prop('checked');
        $(this).parents('.rc-selectall-group:first').find('input[type="checkbox"]').prop('checked', val);
        if (val === true)
            $(this).parents('.rc-selectall-group:first').find('.rc-mutex-group').find('input[type="checkbox"]').first().change();
    });

    jqnode.find('.rc-mutex-group').each(function(){
        let checks = $(this).find('input[type="checkbox"]');
        checks.change(function(){
            let sender = $(this);
            if (sender.prop('checked')){
                checks.each(function(){
                    let tgt = $(this);
                    if (tgt[0] !== sender[0]){
                        tgt.prop('checked', false);
                    }
                });
            }
        });
    });

    jqnode.find('.rc-dirty-group').each(function(){
        let dirtycheck = $(this).find('input[type="checkbox"].rc-dirty-check');
        let dirtyuncheck = $(this).find('input[type="checkbox"].rc-dirty-uncheck');
        let childcheck = $(this).find('input[type="checkbox"]').filter(function(){return !($(this).hasClass('rc-dirty-check') || $(this).hasClass('rc-dirty-uncheck'))});
        childcheck.change(function(){
            let existChecked = false;
            childcheck.each(function(){
                if ($(this).prop('checked')){
                    existChecked = true;
                    return;
                }
            });
            if (existChecked)
                dirtycheck.prop('checked', true);
            else
                dirtyuncheck.prop('checked', false);
        });
        dirtycheck.change(function(){
            if (!$(this).prop('checked'))
                childcheck.prop('checked', false);
        });
        dirtyuncheck.change(function(){
            if ($(this).prop('checked'))
                childcheck.first().prop('checked', true);
        });
    });
};